import sys
import os
from pathlib import Path

# 处理导入路径
if __name__ == "__main__":
    # 直接运行此文件时，添加项目根目录到路径
    project_root = str(Path(__file__).parent.parent)
    if project_root not in sys.path:
        sys.path.insert(0, project_root)
    from pages.base_page import BasePage
else:
    # 作为模块导入时使用相对导入
    from .base_page import BasePage

from playwright.sync_api import Page

class LoginPage(BasePage):
    """
    登录页面对象，封装了登录页面的元素和操作。
    基于登录界面.html的元素结构实现。
    """

    # --- 元素定位器 ---
    _USERNAME_INPUT = "#username"  # 用户名输入框
    _PASSWORD_INPUT = "#password"  # 密码输入框
    _LOGIN_BUTTON = "button.btn"   # 登录按钮
    _ERROR_MESSAGE = ".error-message" # 错误消息
    _REGISTER_LINK = "a[href*='register']" # 注册链接

    def __init__(self, page: Page):
        """
        构造函数，初始化 LoginPage。

        :param page: Playwright 的 Page 对象。
        """
        super().__init__(page)
        self.url = "/campustradingwall_war_exploded/login.jsp"  # 登录页面的相对 URL

    def navigate_to_login_page(self, base_url: str):
        """
        导航到登录页面。

        :param base_url: 网站的基础 URL。
        """
        self.navigate(base_url + self.url)

    def login(self, username, password):
        """
        执行登录操作。

        :param username: 用户名。
        :param password: 密码。
        :return: 登录成功后会自动跳转到首页
        """
        self.fill(self._USERNAME_INPUT, username)
        self.fill(self._PASSWORD_INPUT, password)
        self.click(self._LOGIN_BUTTON)
        
    def is_login_successful(self) -> bool:
        """
        检查是否登录成功（通过检查首页上的用户名元素）
        
        :return: 如果找到用户名元素，返回True，否则返回False
        """
        # 首页上显示用户名的元素
        user_name_element = "header .header-user-actions span"
        try:
            # 等待页面跳转后出现用户名元素
            self.wait_for_selector(user_name_element, timeout=5000)
            return True
        except:
            return False

    def get_logged_in_username(self) -> str:
        """
        获取登录后显示的用户名

        :return: 用户名文本
        """
        # --- 修改这里 ---
        # 使用与 is_login_successful 方法中相同的、已被验证有效的定位器
        username_locator_str = "header .header-user-actions span"
        username_element = self.page.locator(username_locator_str)

        # 增加一个等待，确保元素稳定后再获取文本，这是一种更稳健的做法
        try:
            username_element.wait_for(timeout=3000)  # 等待元素出现
            return username_element.text_content() if username_element.is_visible() else ""
        except:
            return ""  # 如果等待超时，返回空字符串
        
    def get_error_message(self) -> str:
        """
        获取登录失败时的错误消息。

        :return: 错误消息文本。
        """
        error_element = self.page.locator(self._ERROR_MESSAGE)
        return error_element.text_content() if error_element.is_visible() else ""
        
    def click_register_link(self):
        """
        点击注册链接，跳转到注册页面。
        """
        self.click(self._REGISTER_LINK)
        
# 如果直接运行此文件，执行简单的测试
if __name__ == "__main__":
    from playwright.sync_api import sync_playwright
    import time
    
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False)
        page = browser.new_page()
        
        login_page = LoginPage(page)
        base_url = "http://localhost:8080"  # 根据实际环境修改
        
        print("正在测试登录页面...")
        login_page.navigate_to_login_page(base_url)
        
        # 等待一段时间以便查看页面
        time.sleep(2)
        
        print("测试完成，关闭浏览器")
        browser.close()